#include"Stack.h"


void STTest(void)
{
    ST st;//定义一个栈“st”
    STInit(&st);
    //入栈
    StackPush(&st, 1);
    StackPush(&st, 2);
    StackPush(&st, 3);
    StackPush(&st, 4);
    StackPop(&st);//出栈
    STPrint(&st);
    printf("size: %d\n",STSize(&st));
    //循环出栈,并且循环打印
    while (!STEmpty(&st)) {
        STDataType data = StackTop(&st);//取栈顶数据
        printf("%d ",data);
        StackPop(&st);//出栈·
    }
    printf("\n");
    printf("size: %d\n",STSize(&st));//打印栈中有效数据
    STDestroy(&st);//销毁
}
//栈解决括号匹配的问题
bool isValid(char* s) {
    //创建栈,并初始化
    ST st;
    STInit(&st);
    //创建字符指针，遍历字符串,直到字符串被遍历完成
    char* ps = s;
    while(*ps != '\0')
    {
        //判断是左括号还是右括号
        //左括号
        if(*ps == '{' || *ps == '[' || *ps == '(')
        {
            //入栈
            StackPush(&st,*ps);
        }
        else//右括号
        {
            //判断右括号与栈顶中括号是否匹配
            //取栈顶数据时，需判断栈是否为空，若栈为空，则销毁它，直接返回 false
            if(STEmpty(&st))
            {
                STDestroy(&st);
                return false;
            }
            char tmp = StackTop(&st);
            if((*ps == '}' && tmp == '{')
            || (*ps == ']' && tmp == '[')
            || (*ps == ')' && tmp == '('))
            {
                //匹配，栈中元素出栈
                StackPop(&st);
            }
            else//不匹配时，先销毁栈，再返回 false。
            {
                STDestroy(&st);
                return false;
            }
            //别忘了把字符串指针 ps 后移
        }
        ps++;
    }
    //最后销毁栈,并返回 true，表示匹配成功
    //需要判断栈是否为空，来确认字符串是否有效
    bool ret = STEmpty(&st);
    STDestroy(&st);
    return ret;
}
int main(int argc, const char * argv[]) {
    STTest();
    //——————————————————————————
    //char* s = "{[()]}";
    //bool tmp = isValid(s);
    //if(tmp == true)
    //{
    //    printf("true\n");
    //}
    //else
    //    printf("false\n");
    return 0;
}
